package com.rainyun.rc.config;

import java.io.IOException;
import java.util.Map;

/**配置管理中心*/
public interface RainConfig {
	/**设置根路径*/
	void setRootPath(String root);
	/**添加/设置配置实体的储存路径(无需加文件后缀),若以/结尾,则认为是该路径下的配置列表*/
	RainConfig add(Class<?> type,String path);
	
	void setPaths(Map<Class<?>,String> paths);
	Map<Class<?>,String> getPaths();
	
	void load(Class<?> type) throws Exception;

	void loadOrNew(Class<?> type) throws Exception;
	
	void loadAll() throws Exception;
	
	void loadAllOrNew() throws Exception;
	
	void save(Class<?> type) throws IOException;
	
	void saveInFolder(Class<?> type,String name) throws IOException;
	
	void saveAll() throws IOException;
	
	<T> T get(Class<T> type);
	
	<T> Map<String,T> getFolder(Class<T> type);
	
	void set(Class<?> type,Object obj);
	
	void setErrorHandler(ErrorHandler handler);

	/**开关文件版本检查(config_version节点检查)*/
	void setVerCheck(Class<?> c,boolean b);
	/**配置是否开启版本检查(config_version节点检查)*/
	boolean isVerCheck(Class<?> c);

	/**获取注释配置树,<br>
	 * 若该配置是一个配置列表,返回的配置树第一层键将是配置列表的各文件名
	 * */
	Map<String,Object> getDescTree(Class<?> type);
	/**设置注释配置树*/
	void setDescTree(Class<?> type,Map<String,Object> tree);
	
	/**开关配置的注释支持
	 * 开启后,读取文件可以获得注释配置树<br>
	 * 使得保存文件可以保留注释<br>*/
	void setDesc(Class<?> type,boolean b);
	/**配置是否开启注释支持*/
	boolean isDesc(Class<?> type);
	
}
